import { forEach } from "./utils.js";
import Module from "./module.js";

class ModuleCollection {
  constructor(options) {
    // 对数据进行格式化
    this.root = null;
    this.register([], options); // 为了记录父子关系
  }
  getNamespaced(path) {
    // 返回一个字符串 a/b/c
    let root = this.root;
    let ns = path.reduce((ns, key) => {
      // key模块名
      let module = root.getChild(key);
      root = module;
      return module.namespaced ? ns + key + "/" : ns;
    }, "");
    return ns;
  }
  register(path, rawModule) {
    // let newModule = {
    //   _raw: rootModule,
    //   _children: {},
    //   state: rootModule.state,
    // };
    let newModule = new Module(rawModule);
    rawModule.newModule = newModule; // 自定义属性
    if (path.length == 0) {
      this.root = newModule;
    } else {
      // [a]  [a,c]
      // 根据当前注册的key， 将他注册到对应的模块的儿子处
      // 找父亲
      let parent = path.slice(0, -1).reduce((memo, current) => {
        // return memo._children[current];
        return memo.getChild(current);
      }, this.root);
      // parent._children[path[path.length - 1]] = newModule;
      parent.addChild(path[path.length - 1], newModule);
      // this.root._children
    }
    // 注册完毕当前模块， 再进行注册根模块
    if (rawModule.modules) {
      forEach(rawModule.modules, (module, key) => {
        // console.log(module);
        // ? register
        this.register(path.concat(key), module);
      });
    }
  }
}

export default ModuleCollection;

// this.root = {
//   _raw: "用户定义的模块",
//   state: "当前模块自己的定义",
//   _children: {
//     // 孩子列表
//     a: {
//       _raw: "用户定义的模块",
//       state: "当前模块自己的定义",
//       _children: {},
//     },
//   },
// };
